/*
 * operacionesPPD.c
 *
 *  Created on: 05/10/2011
 *      Author: diegoar27
 */

#include "operacionesPPD.h"

/*Thread*/
void *inicializarPorcesoPPD(int* fd){

	t_chs *chsActual = getCHSActual();
	t_config *config = getConfig();
	int cantPeticiones = 0;
	int petAtendidas = 0;
	while (1){

		t_peticion *peticionSiguiente = tomarSiguientePeticion(config->algoritmoPlanificacion);
		if (peticionSiguiente != NULL){
			resolverPeticion(peticionSiguiente,fd);
		}
		else
		{
			logMessage(LOG_ERR,"Error con peticio siguiente, NO HAY PETICIONES A ATENDER WTF!");
			sleep(1);
		}
	}
}

void resolverPeticion(t_peticion *peticion, int fd){

	int error = 0;
	char * msj ;
	t_config *config = getConfig();
	t_chs *chsActual = getCHSActual();

	if (peticion->tOperacion == LECTURA){
		leerSector(chsActual,peticion->info,fd, config->tiempoLectura);
	}else if (peticion->tOperacion == ESCRITURA) {
		escribirSector(chsActual,peticion->info,fd, config->tiempoEscritura);
	}else{
		msj = resolverTrace(peticion,fd);
		if ((send(remote, msj, strlen(msj), 0)) == -1){
			free(msj);
			perror("Error al enviar mensaje de Trace a la consola.\n");
			exit(1);
		}
		free(msj);
	}

	if(error > 0){
		/*modifico peticion para que devuelva el error en el info*/
	}
	else
	{
		t_list *listResueltos = getListPeticionesResueltas();
		collection_list_add(listResueltos, peticion);
	}
}

/*Ver probablemente este mal el metodo... flor estaba haciendo lo mismo */

t_peticion *peticionStringToPeticion(char* sPeticion){

   t_peticion* paquete;

   int 	offset = 0,	tmp_size = 0 ;
   memcpy (&paquete->tOperacion,sPeticion, tmp_size = sizeof(char) );
   offset = tmp_size;
   memcpy (&paquete->length,sPeticion + offset ,tmp_size = sizeof(short));
   offset += tmp_size;
   /*tamaño del sector 4 bytes dentro del payload*/
   memcpy (&paquete->nSector, sPeticion + offset, tmp_size = sizeof(int));
   offset += tmp_size;
   memcpy (&paquete->info, sPeticion + offset, paquete->length);

   return paquete;
}

char *peticionToPeticionString(t_peticion *peticion){
	char* msj = (char*)malloc(sizeof(SIZEPAYLOAD));
	int offset = 0,	tmp_size = 0 ;

	memcpy(msj,peticion->tOperacion,tmp_size = sizeof(char));
	memcpy(msj + tmp_size, peticion->length , tmp_size += sizeof(short));
	memcpy(msj + tmp_size, peticion->nSector , tmp_size += sizeof(int));
	tmp_size += sizeof(peticion->info);
	memcpy(msj + tmp_size, peticion->info, tmp_size + 1); /* se agrega uno por el caracter fin de cadena */

	return msj;
}

int buscarPosicionLista(t_list *peticiones, int nSector){

	int posicion = 0;
	t_peticion *  siguientePeticion = peticiones->head;

	while(posicion <= peticiones->elements_count){
		if (nSector == siguientePeticion->nSector){
			return posicion;
		}else{
			siguientePeticion = collection_list_get(peticiones,posicion++);
		}
	}
	return -1;
}
